package co.edu.javeriana.konigsberg.xavier.servicio;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ejb.EJB;
import javax.ejb.Stateful;
import javax.ejb.Stateless;

import co.edu.javeriana.konigsberg.xavier.dao.desc.FacultadDAOLocal;
import co.edu.javeriana.konigsberg.xavier.dto.AreaGestionDTO;
import co.edu.javeriana.konigsberg.xavier.dto.FacultadDTO;
import co.edu.javeriana.konigsberg.xavier.entidad.Facultad;

/**
 * Session Bean implementation class FacultadServicio
 */
@Stateless
public class FacultadServicio implements FacultadServicioRemote, FacultadServicioLocal {
	
	@EJB
	private FacultadDAOLocal facultadDAO;
	
	private List<FacultadDTO> facultadesDtos;
	
	private static Map<BigInteger, List<FacultadDTO>> mapaFacultadesPorAreaGestion;
	private static Map<BigInteger, FacultadDTO> mapaFacultades;
    /**
     * Default constructor. 
     */
    public FacultadServicio() {
        // TODO Auto-generated constructor stub
    }
    
    @Override
    public List<FacultadDTO> obtenerLista(){
    	if(facultadesDtos == null){
    		List<Facultad> facultads = facultadDAO.obtenerLista();
    		facultadesDtos = new ArrayList<FacultadDTO>();
    		for (Facultad facultad : facultads) {
				FacultadDTO facultadDTO = getDTO(facultad, null);
				facultadesDtos.add(facultadDTO);
			}
    	}
		return facultadesDtos;
	}

	public FacultadDTO getDTO(Object entidad, AreaGestionDTO areaGestionDTO) {
		Facultad facultad = (Facultad)entidad;
		FacultadDTO facultadDTO = new FacultadDTO();
		facultadDTO.setIdFacultad(facultad.getIdFacultad());
		facultadDTO.setAreaGestionDTO(areaGestionDTO);
		facultadDTO.setNombreFacultad(facultad.getNombreFacultad());
		return facultadDTO;
	}
    
	@Override
	public FacultadDTO obtenerFacultadPorId(BigInteger id) {
		return mapaFacultades.get(id);
	}
	
	@Override
    public List<FacultadDTO> obtenerListaDePadre(AreaGestionDTO areaGestionDTO){
    	if(mapaFacultadesPorAreaGestion == null){
    		mapaFacultadesPorAreaGestion = new HashMap<BigInteger, List<FacultadDTO>>();
		}
		if(mapaFacultadesPorAreaGestion.containsKey(areaGestionDTO.getIdAreaGestion())){
			return mapaFacultadesPorAreaGestion.get(areaGestionDTO.getIdAreaGestion());
		}else{
			if(mapaFacultades == null){
				mapaFacultades = new HashMap<BigInteger, FacultadDTO>();
			}
			List<Facultad> facultads = facultadDAO.obtenerListaPorPadre(areaGestionDTO.getIdAreaGestion());
			List<FacultadDTO> facultadDTOs = new ArrayList<FacultadDTO>();
			for (Facultad facultad : facultads) {
				FacultadDTO facultadDTO = getDTO(facultad, areaGestionDTO);
				facultadDTOs.add(facultadDTO);
				mapaFacultades.put(facultadDTO.getIdFacultad(), facultadDTO);
			}
			mapaFacultadesPorAreaGestion.put(areaGestionDTO.getIdAreaGestion(), facultadDTOs);
			return facultadDTOs;
		}
		
	}
}
